package cn.harry.cabinet.view.fragments

import android.os.Bundle
import android.view.View
import androidx.fragment.app.Fragment
import cn.harry.cabinet.theme.manager.ButtonThemeManager
import cn.harry.cabinet.theme.manager.ThemeManager
import cn.harry.cabinet.theme.updater.DynamicThemeUpdater

/**
 * 基础Fragment类
 * 提供统一的主题应用功能，确保所有继承的Fragment都能正确应用主题
 * 
 * 特性：
 * - 自动应用当前主题到Fragment中的所有按钮
 * - 在onViewCreated中自动调用主题应用
 * - 提供主题应用的扩展方法
 */
abstract class BaseFragment : Fragment() {

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        
        // 延迟应用主题，确保所有子视图都已创建完成
        view.post {
            applyThemeToFragment()
        }
    }
    
    /**
     * 应用当前主题到Fragment中的所有UI元素
     * 
     * 子类可以重写此方法来自定义主题应用逻辑
     */
    protected open fun applyThemeToFragment() {
        view?.let { fragmentView ->
            try {
                val currentTheme = ThemeManager.getCurrentTheme(requireContext())
                
                // 应用按钮主题到Fragment中的所有按钮
                ButtonThemeManager.updateAllButtonsInView(fragmentView, currentTheme, requireContext())
                
                // 应用其他主题元素（背景、文字颜色等）
                DynamicThemeUpdater.updateViewTheme(fragmentView, currentTheme, requireContext())
                
            } catch (e: Exception) {
                android.util.Log.w("BaseFragment", 
                    "Failed to apply theme to ${this::class.simpleName}: ${e.message}")
            }
        }
    }
    
    /**
     * 手动触发主题应用
     * 可在主题切换后调用此方法来更新Fragment的主题
     */
    fun refreshTheme() {
        applyThemeToFragment()
    }
    
    /**
     * 检查Fragment是否有按钮需要主题应用
     * 子类可以重写此方法来优化性能
     */
    protected open fun hasButtonsForTheme(): Boolean {
        return true // 默认假设所有Fragment都可能有按钮
    }
    
    /**
     * 获取当前主题
     * 提供便捷的主题获取方法
     */
    protected fun getCurrentTheme(): ThemeManager.Theme {
        return ThemeManager.getCurrentTheme(requireContext())
    }
}